跳到主要内容

object、Object以及{}的区别

在 TypeScript 中,objectObject{} 都与“对象”相关,但它们的含义和使用场景有重要区别。以下是它们的详细解释:

1. object (小写,TypeScript 内置类型)

  • 定义:这是 TypeScript 2.2 引入的一个原始类型 (primitive type),表示“非原始类型”的值,即不是 stringnumberbooleansymbolnullundefined 的类型。
  • 特点
    • 表示所有非原始类型的对象,包括普通对象、数组、函数、Date 等。
    • 不能访问任何属性或方法(因为它没有预定义的结构)。
  • 用途:当你只想确保一个值是一个对象(而不是原始值)时使用。
  • 示例
let a: object;
a = { name: 'Alice' }; // OK
a = []; // OK
a = () => {}; // OK
a = 'hello'; // Error: 不能将 string 赋值给 object
a.name; // 类型“object”上不存在属性“name”。

2. Object (大写,TypeScript 兼容 JavaScript 的类型)

  • 定义:这是对 JavaScript 中 Object 构造函数的类型表示。它等价于 object | null | undefined 在严格模式下,但通常被当作一个“宽泛的对象类型”。
  • 特点
    • 在非严格模式下,几乎任何非 nullundefined 的值都可以赋值给 Object
    • 它包含 object 类型,并且还允许 nullundefined(取决于 strictNullChecks 设置)。
    • 可以调用 Object 原型上的方法,如 .toString().hasOwnProperty() 等。
  • 注意:由于其过于宽泛,通常不推荐使用 Object,建议使用更具体的类型。
  • 示例
let b: Object;
b = { name: 'Alice' }; // OK
b = []; // OK
b = 'hello'; // OK
b = 12; // OK
b = null; // 不能将类型“null”分配给类型“Object”。
b.name; //类型“Object”上不存在属性“name”。

3. {} (空对象类型)

  • 定义:表示一个没有任何自身属性的对象类型。它描述的是“空对象字面量” {} 的结构。
  • 特点
    • 可以赋值给任何包含或不包含属性的对象(因为对象可以有额外属性)。
    • 不能访问任何属性(因为类型系统认为它没有属性)。
    • nullundefined 不能赋值给 {}(除非 strictNullChecks 关闭)。
  • 常见误解{} 并不表示“任意对象”,而是“没有属性的对象”。
  • 示例
let c: {};
c = {}; // OK
c = { name: 'Alice' }; // OK(结构兼容)
c = []; // OK(数组也是对象)
c = 12;
c = null; // 不能将类型“null”分配给类型“{}”
c.name; // 类型“{}”上不存在属性“name”。

总结对比

类型是否可访问属性是否包含原始类型是否包含 null/undefined推荐使用场景
object❌ 否❌ 否✅ 取决于配置确保值是对象(非原始值)
Object❌ 否✅ 是(宽泛)❌ 否避免使用,过于宽泛
{}❌ 否✅ 是❌ 否(严格模式)很少直接使用,常用于泛型约束

最佳实践

  • 使用 object 来表示“非原始值”。
  • 避免使用 Object,除非与旧代码兼容。
  • 使用 {} 要小心,它不是“任意对象”,而是“无属性对象”。
  • 更推荐使用具体接口或类型,如 Record<string, any>unknown 来表示任意对象。